/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package entidade.controller.JPA;

import entidade.controller.JPA.exceptions.IllegalOrphanException;
import entidade.controller.JPA.exceptions.NonexistentEntityException;
import entidade.controller.JPA.exceptions.RollbackFailureException;
import entidade.persistencia.Produto;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import entidade.persistencia.CategoriaProduto;
import entidade.persistencia.ProdutoNumeroSerie;
import java.util.ArrayList;
import java.util.List;
import entidade.persistencia.ProdutoVenda;
import entidade.persistencia.ReparoProdutoNumeroSerie;
import entidade.persistencia.ProdutoManutencao;
import entidade.persistencia.ProdutoCompra;
import javax.transaction.UserTransaction;

/**
 *
 * @author victorinox
 */
public class ProdutoJpaController {
    @Resource
    private UserTransaction utx = null;
    @PersistenceUnit(unitName = "globalimage2PU")
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Produto produto) throws RollbackFailureException, Exception {
        if (produto.getProdutoNumeroSerieCollection() == null) {
            produto.setProdutoNumeroSerieCollection(new ArrayList<ProdutoNumeroSerie>());
        }
        if (produto.getProdutoVendaCollection() == null) {
            produto.setProdutoVendaCollection(new ArrayList<ProdutoVenda>());
        }
        if (produto.getReparoProdutoNumeroSerieCollection() == null) {
            produto.setReparoProdutoNumeroSerieCollection(new ArrayList<ReparoProdutoNumeroSerie>());
        }
        if (produto.getProdutoManutencaoCollection() == null) {
            produto.setProdutoManutencaoCollection(new ArrayList<ProdutoManutencao>());
        }
        if (produto.getProdutoCompraCollection() == null) {
            produto.setProdutoCompraCollection(new ArrayList<ProdutoCompra>());
        }
        EntityManager em = null;
        try {
            utx.begin();
            em = getEntityManager();
            CategoriaProduto categoriaId = produto.getCategoriaId();
            if (categoriaId != null) {
                categoriaId = em.getReference(categoriaId.getClass(), categoriaId.getCategoriaId());
                produto.setCategoriaId(categoriaId);
            }
            List<ProdutoNumeroSerie> attachedProdutoNumeroSerieCollection = new ArrayList<ProdutoNumeroSerie>();
            for (ProdutoNumeroSerie produtoNumeroSerieCollectionProdutoNumeroSerieToAttach : produto.getProdutoNumeroSerieCollection()) {
                produtoNumeroSerieCollectionProdutoNumeroSerieToAttach = em.getReference(produtoNumeroSerieCollectionProdutoNumeroSerieToAttach.getClass(), produtoNumeroSerieCollectionProdutoNumeroSerieToAttach.getNumeroSerieId());
                attachedProdutoNumeroSerieCollection.add(produtoNumeroSerieCollectionProdutoNumeroSerieToAttach);
            }
            produto.setProdutoNumeroSerieCollection(attachedProdutoNumeroSerieCollection);
            List<ProdutoVenda> attachedProdutoVendaCollection = new ArrayList<ProdutoVenda>();
            for (ProdutoVenda produtoVendaCollectionProdutoVendaToAttach : produto.getProdutoVendaCollection()) {
                produtoVendaCollectionProdutoVendaToAttach = em.getReference(produtoVendaCollectionProdutoVendaToAttach.getClass(), produtoVendaCollectionProdutoVendaToAttach.getProdutoVendaPK());
                attachedProdutoVendaCollection.add(produtoVendaCollectionProdutoVendaToAttach);
            }
            produto.setProdutoVendaCollection(attachedProdutoVendaCollection);
            List<ReparoProdutoNumeroSerie> attachedReparoProdutoNumeroSerieCollection = new ArrayList<ReparoProdutoNumeroSerie>();
            for (ReparoProdutoNumeroSerie reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerieToAttach : produto.getReparoProdutoNumeroSerieCollection()) {
                reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerieToAttach = em.getReference(reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerieToAttach.getClass(), reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerieToAttach.getReparoProdutoNumeroSerieId());
                attachedReparoProdutoNumeroSerieCollection.add(reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerieToAttach);
            }
            produto.setReparoProdutoNumeroSerieCollection(attachedReparoProdutoNumeroSerieCollection);
            List<ProdutoManutencao> attachedProdutoManutencaoCollection = new ArrayList<ProdutoManutencao>();
            for (ProdutoManutencao produtoManutencaoCollectionProdutoManutencaoToAttach : produto.getProdutoManutencaoCollection()) {
                produtoManutencaoCollectionProdutoManutencaoToAttach = em.getReference(produtoManutencaoCollectionProdutoManutencaoToAttach.getClass(), produtoManutencaoCollectionProdutoManutencaoToAttach.getProdutoManutencaoPK());
                attachedProdutoManutencaoCollection.add(produtoManutencaoCollectionProdutoManutencaoToAttach);
            }
            produto.setProdutoManutencaoCollection(attachedProdutoManutencaoCollection);
            List<ProdutoCompra> attachedProdutoCompraCollection = new ArrayList<ProdutoCompra>();
            for (ProdutoCompra produtoCompraCollectionProdutoCompraToAttach : produto.getProdutoCompraCollection()) {
                produtoCompraCollectionProdutoCompraToAttach = em.getReference(produtoCompraCollectionProdutoCompraToAttach.getClass(), produtoCompraCollectionProdutoCompraToAttach.getProdutoCompraPK());
                attachedProdutoCompraCollection.add(produtoCompraCollectionProdutoCompraToAttach);
            }
            produto.setProdutoCompraCollection(attachedProdutoCompraCollection);
            em.persist(produto);
            if (categoriaId != null) {
                categoriaId.getProdutoCollection().add(produto);
                categoriaId = em.merge(categoriaId);
            }
            for (ProdutoNumeroSerie produtoNumeroSerieCollectionProdutoNumeroSerie : produto.getProdutoNumeroSerieCollection()) {
                Produto oldProdutoIdOfProdutoNumeroSerieCollectionProdutoNumeroSerie = produtoNumeroSerieCollectionProdutoNumeroSerie.getProdutoId();
                produtoNumeroSerieCollectionProdutoNumeroSerie.setProdutoId(produto);
                produtoNumeroSerieCollectionProdutoNumeroSerie = em.merge(produtoNumeroSerieCollectionProdutoNumeroSerie);
                if (oldProdutoIdOfProdutoNumeroSerieCollectionProdutoNumeroSerie != null) {
                    oldProdutoIdOfProdutoNumeroSerieCollectionProdutoNumeroSerie.getProdutoNumeroSerieCollection().remove(produtoNumeroSerieCollectionProdutoNumeroSerie);
                    oldProdutoIdOfProdutoNumeroSerieCollectionProdutoNumeroSerie = em.merge(oldProdutoIdOfProdutoNumeroSerieCollectionProdutoNumeroSerie);
                }
            }
            for (ProdutoVenda produtoVendaCollectionProdutoVenda : produto.getProdutoVendaCollection()) {
                Produto oldProdutoOfProdutoVendaCollectionProdutoVenda = produtoVendaCollectionProdutoVenda.getProduto();
                produtoVendaCollectionProdutoVenda.setProduto(produto);
                produtoVendaCollectionProdutoVenda = em.merge(produtoVendaCollectionProdutoVenda);
                if (oldProdutoOfProdutoVendaCollectionProdutoVenda != null) {
                    oldProdutoOfProdutoVendaCollectionProdutoVenda.getProdutoVendaCollection().remove(produtoVendaCollectionProdutoVenda);
                    oldProdutoOfProdutoVendaCollectionProdutoVenda = em.merge(oldProdutoOfProdutoVendaCollectionProdutoVenda);
                }
            }
            for (ReparoProdutoNumeroSerie reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie : produto.getReparoProdutoNumeroSerieCollection()) {
                Produto oldProdutoIdOfReparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie = reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie.getProdutoId();
                reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie.setProdutoId(produto);
                reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie = em.merge(reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie);
                if (oldProdutoIdOfReparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie != null) {
                    oldProdutoIdOfReparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie.getReparoProdutoNumeroSerieCollection().remove(reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie);
                    oldProdutoIdOfReparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie = em.merge(oldProdutoIdOfReparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie);
                }
            }
            for (ProdutoManutencao produtoManutencaoCollectionProdutoManutencao : produto.getProdutoManutencaoCollection()) {
                Produto oldProdutoOfProdutoManutencaoCollectionProdutoManutencao = produtoManutencaoCollectionProdutoManutencao.getProduto();
                produtoManutencaoCollectionProdutoManutencao.setProduto(produto);
                produtoManutencaoCollectionProdutoManutencao = em.merge(produtoManutencaoCollectionProdutoManutencao);
                if (oldProdutoOfProdutoManutencaoCollectionProdutoManutencao != null) {
                    oldProdutoOfProdutoManutencaoCollectionProdutoManutencao.getProdutoManutencaoCollection().remove(produtoManutencaoCollectionProdutoManutencao);
                    oldProdutoOfProdutoManutencaoCollectionProdutoManutencao = em.merge(oldProdutoOfProdutoManutencaoCollectionProdutoManutencao);
                }
            }
            for (ProdutoCompra produtoCompraCollectionProdutoCompra : produto.getProdutoCompraCollection()) {
                Produto oldProdutoOfProdutoCompraCollectionProdutoCompra = produtoCompraCollectionProdutoCompra.getProduto();
                produtoCompraCollectionProdutoCompra.setProduto(produto);
                produtoCompraCollectionProdutoCompra = em.merge(produtoCompraCollectionProdutoCompra);
                if (oldProdutoOfProdutoCompraCollectionProdutoCompra != null) {
                    oldProdutoOfProdutoCompraCollectionProdutoCompra.getProdutoCompraCollection().remove(produtoCompraCollectionProdutoCompra);
                    oldProdutoOfProdutoCompraCollectionProdutoCompra = em.merge(oldProdutoOfProdutoCompraCollectionProdutoCompra);
                }
            }
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Produto produto) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            utx.begin();
            em = getEntityManager();
            Produto persistentProduto = em.find(Produto.class, produto.getProdutoId());
            CategoriaProduto categoriaIdOld = persistentProduto.getCategoriaId();
            CategoriaProduto categoriaIdNew = produto.getCategoriaId();
            List<ProdutoNumeroSerie> produtoNumeroSerieCollectionOld = persistentProduto.getProdutoNumeroSerieCollection();
            List<ProdutoNumeroSerie> produtoNumeroSerieCollectionNew = produto.getProdutoNumeroSerieCollection();
            List<ProdutoVenda> produtoVendaCollectionOld = persistentProduto.getProdutoVendaCollection();
            List<ProdutoVenda> produtoVendaCollectionNew = produto.getProdutoVendaCollection();
            List<ReparoProdutoNumeroSerie> reparoProdutoNumeroSerieCollectionOld = persistentProduto.getReparoProdutoNumeroSerieCollection();
            List<ReparoProdutoNumeroSerie> reparoProdutoNumeroSerieCollectionNew = produto.getReparoProdutoNumeroSerieCollection();
            List<ProdutoManutencao> produtoManutencaoCollectionOld = persistentProduto.getProdutoManutencaoCollection();
            List<ProdutoManutencao> produtoManutencaoCollectionNew = produto.getProdutoManutencaoCollection();
            List<ProdutoCompra> produtoCompraCollectionOld = persistentProduto.getProdutoCompraCollection();
            List<ProdutoCompra> produtoCompraCollectionNew = produto.getProdutoCompraCollection();
            List<String> illegalOrphanMessages = null;
            for (ProdutoNumeroSerie produtoNumeroSerieCollectionOldProdutoNumeroSerie : produtoNumeroSerieCollectionOld) {
                if (!produtoNumeroSerieCollectionNew.contains(produtoNumeroSerieCollectionOldProdutoNumeroSerie)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain ProdutoNumeroSerie " + produtoNumeroSerieCollectionOldProdutoNumeroSerie + " since its produtoId field is not nullable.");
                }
            }
            for (ProdutoVenda produtoVendaCollectionOldProdutoVenda : produtoVendaCollectionOld) {
                if (!produtoVendaCollectionNew.contains(produtoVendaCollectionOldProdutoVenda)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain ProdutoVenda " + produtoVendaCollectionOldProdutoVenda + " since its produto field is not nullable.");
                }
            }
            for (ProdutoManutencao produtoManutencaoCollectionOldProdutoManutencao : produtoManutencaoCollectionOld) {
                if (!produtoManutencaoCollectionNew.contains(produtoManutencaoCollectionOldProdutoManutencao)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain ProdutoManutencao " + produtoManutencaoCollectionOldProdutoManutencao + " since its produto field is not nullable.");
                }
            }
            for (ProdutoCompra produtoCompraCollectionOldProdutoCompra : produtoCompraCollectionOld) {
                if (!produtoCompraCollectionNew.contains(produtoCompraCollectionOldProdutoCompra)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain ProdutoCompra " + produtoCompraCollectionOldProdutoCompra + " since its produto field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (categoriaIdNew != null) {
                categoriaIdNew = em.getReference(categoriaIdNew.getClass(), categoriaIdNew.getCategoriaId());
                produto.setCategoriaId(categoriaIdNew);
            }
            List<ProdutoNumeroSerie> attachedProdutoNumeroSerieCollectionNew = new ArrayList<ProdutoNumeroSerie>();
            for (ProdutoNumeroSerie produtoNumeroSerieCollectionNewProdutoNumeroSerieToAttach : produtoNumeroSerieCollectionNew) {
                produtoNumeroSerieCollectionNewProdutoNumeroSerieToAttach = em.getReference(produtoNumeroSerieCollectionNewProdutoNumeroSerieToAttach.getClass(), produtoNumeroSerieCollectionNewProdutoNumeroSerieToAttach.getNumeroSerieId());
                attachedProdutoNumeroSerieCollectionNew.add(produtoNumeroSerieCollectionNewProdutoNumeroSerieToAttach);
            }
            produtoNumeroSerieCollectionNew = attachedProdutoNumeroSerieCollectionNew;
            produto.setProdutoNumeroSerieCollection(produtoNumeroSerieCollectionNew);
            List<ProdutoVenda> attachedProdutoVendaCollectionNew = new ArrayList<ProdutoVenda>();
            for (ProdutoVenda produtoVendaCollectionNewProdutoVendaToAttach : produtoVendaCollectionNew) {
                produtoVendaCollectionNewProdutoVendaToAttach = em.getReference(produtoVendaCollectionNewProdutoVendaToAttach.getClass(), produtoVendaCollectionNewProdutoVendaToAttach.getProdutoVendaPK());
                attachedProdutoVendaCollectionNew.add(produtoVendaCollectionNewProdutoVendaToAttach);
            }
            produtoVendaCollectionNew = attachedProdutoVendaCollectionNew;
            produto.setProdutoVendaCollection(produtoVendaCollectionNew);
            List<ReparoProdutoNumeroSerie> attachedReparoProdutoNumeroSerieCollectionNew = new ArrayList<ReparoProdutoNumeroSerie>();
            for (ReparoProdutoNumeroSerie reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerieToAttach : reparoProdutoNumeroSerieCollectionNew) {
                reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerieToAttach = em.getReference(reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerieToAttach.getClass(), reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerieToAttach.getReparoProdutoNumeroSerieId());
                attachedReparoProdutoNumeroSerieCollectionNew.add(reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerieToAttach);
            }
            reparoProdutoNumeroSerieCollectionNew = attachedReparoProdutoNumeroSerieCollectionNew;
            produto.setReparoProdutoNumeroSerieCollection(reparoProdutoNumeroSerieCollectionNew);
            List<ProdutoManutencao> attachedProdutoManutencaoCollectionNew = new ArrayList<ProdutoManutencao>();
            for (ProdutoManutencao produtoManutencaoCollectionNewProdutoManutencaoToAttach : produtoManutencaoCollectionNew) {
                produtoManutencaoCollectionNewProdutoManutencaoToAttach = em.getReference(produtoManutencaoCollectionNewProdutoManutencaoToAttach.getClass(), produtoManutencaoCollectionNewProdutoManutencaoToAttach.getProdutoManutencaoPK());
                attachedProdutoManutencaoCollectionNew.add(produtoManutencaoCollectionNewProdutoManutencaoToAttach);
            }
            produtoManutencaoCollectionNew = attachedProdutoManutencaoCollectionNew;
            produto.setProdutoManutencaoCollection(produtoManutencaoCollectionNew);
            List<ProdutoCompra> attachedProdutoCompraCollectionNew = new ArrayList<ProdutoCompra>();
            for (ProdutoCompra produtoCompraCollectionNewProdutoCompraToAttach : produtoCompraCollectionNew) {
                produtoCompraCollectionNewProdutoCompraToAttach = em.getReference(produtoCompraCollectionNewProdutoCompraToAttach.getClass(), produtoCompraCollectionNewProdutoCompraToAttach.getProdutoCompraPK());
                attachedProdutoCompraCollectionNew.add(produtoCompraCollectionNewProdutoCompraToAttach);
            }
            produtoCompraCollectionNew = attachedProdutoCompraCollectionNew;
            produto.setProdutoCompraCollection(produtoCompraCollectionNew);
            produto = em.merge(produto);
            if (categoriaIdOld != null && !categoriaIdOld.equals(categoriaIdNew)) {
                categoriaIdOld.getProdutoCollection().remove(produto);
                categoriaIdOld = em.merge(categoriaIdOld);
            }
            if (categoriaIdNew != null && !categoriaIdNew.equals(categoriaIdOld)) {
                categoriaIdNew.getProdutoCollection().add(produto);
                categoriaIdNew = em.merge(categoriaIdNew);
            }
            for (ProdutoNumeroSerie produtoNumeroSerieCollectionNewProdutoNumeroSerie : produtoNumeroSerieCollectionNew) {
                if (!produtoNumeroSerieCollectionOld.contains(produtoNumeroSerieCollectionNewProdutoNumeroSerie)) {
                    Produto oldProdutoIdOfProdutoNumeroSerieCollectionNewProdutoNumeroSerie = produtoNumeroSerieCollectionNewProdutoNumeroSerie.getProdutoId();
                    produtoNumeroSerieCollectionNewProdutoNumeroSerie.setProdutoId(produto);
                    produtoNumeroSerieCollectionNewProdutoNumeroSerie = em.merge(produtoNumeroSerieCollectionNewProdutoNumeroSerie);
                    if (oldProdutoIdOfProdutoNumeroSerieCollectionNewProdutoNumeroSerie != null && !oldProdutoIdOfProdutoNumeroSerieCollectionNewProdutoNumeroSerie.equals(produto)) {
                        oldProdutoIdOfProdutoNumeroSerieCollectionNewProdutoNumeroSerie.getProdutoNumeroSerieCollection().remove(produtoNumeroSerieCollectionNewProdutoNumeroSerie);
                        oldProdutoIdOfProdutoNumeroSerieCollectionNewProdutoNumeroSerie = em.merge(oldProdutoIdOfProdutoNumeroSerieCollectionNewProdutoNumeroSerie);
                    }
                }
            }
            for (ProdutoVenda produtoVendaCollectionNewProdutoVenda : produtoVendaCollectionNew) {
                if (!produtoVendaCollectionOld.contains(produtoVendaCollectionNewProdutoVenda)) {
                    Produto oldProdutoOfProdutoVendaCollectionNewProdutoVenda = produtoVendaCollectionNewProdutoVenda.getProduto();
                    produtoVendaCollectionNewProdutoVenda.setProduto(produto);
                    produtoVendaCollectionNewProdutoVenda = em.merge(produtoVendaCollectionNewProdutoVenda);
                    if (oldProdutoOfProdutoVendaCollectionNewProdutoVenda != null && !oldProdutoOfProdutoVendaCollectionNewProdutoVenda.equals(produto)) {
                        oldProdutoOfProdutoVendaCollectionNewProdutoVenda.getProdutoVendaCollection().remove(produtoVendaCollectionNewProdutoVenda);
                        oldProdutoOfProdutoVendaCollectionNewProdutoVenda = em.merge(oldProdutoOfProdutoVendaCollectionNewProdutoVenda);
                    }
                }
            }
            for (ReparoProdutoNumeroSerie reparoProdutoNumeroSerieCollectionOldReparoProdutoNumeroSerie : reparoProdutoNumeroSerieCollectionOld) {
                if (!reparoProdutoNumeroSerieCollectionNew.contains(reparoProdutoNumeroSerieCollectionOldReparoProdutoNumeroSerie)) {
                    reparoProdutoNumeroSerieCollectionOldReparoProdutoNumeroSerie.setProdutoId(null);
                    reparoProdutoNumeroSerieCollectionOldReparoProdutoNumeroSerie = em.merge(reparoProdutoNumeroSerieCollectionOldReparoProdutoNumeroSerie);
                }
            }
            for (ReparoProdutoNumeroSerie reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie : reparoProdutoNumeroSerieCollectionNew) {
                if (!reparoProdutoNumeroSerieCollectionOld.contains(reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie)) {
                    Produto oldProdutoIdOfReparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie = reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie.getProdutoId();
                    reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie.setProdutoId(produto);
                    reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie = em.merge(reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie);
                    if (oldProdutoIdOfReparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie != null && !oldProdutoIdOfReparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie.equals(produto)) {
                        oldProdutoIdOfReparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie.getReparoProdutoNumeroSerieCollection().remove(reparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie);
                        oldProdutoIdOfReparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie = em.merge(oldProdutoIdOfReparoProdutoNumeroSerieCollectionNewReparoProdutoNumeroSerie);
                    }
                }
            }
            for (ProdutoManutencao produtoManutencaoCollectionNewProdutoManutencao : produtoManutencaoCollectionNew) {
                if (!produtoManutencaoCollectionOld.contains(produtoManutencaoCollectionNewProdutoManutencao)) {
                    Produto oldProdutoOfProdutoManutencaoCollectionNewProdutoManutencao = produtoManutencaoCollectionNewProdutoManutencao.getProduto();
                    produtoManutencaoCollectionNewProdutoManutencao.setProduto(produto);
                    produtoManutencaoCollectionNewProdutoManutencao = em.merge(produtoManutencaoCollectionNewProdutoManutencao);
                    if (oldProdutoOfProdutoManutencaoCollectionNewProdutoManutencao != null && !oldProdutoOfProdutoManutencaoCollectionNewProdutoManutencao.equals(produto)) {
                        oldProdutoOfProdutoManutencaoCollectionNewProdutoManutencao.getProdutoManutencaoCollection().remove(produtoManutencaoCollectionNewProdutoManutencao);
                        oldProdutoOfProdutoManutencaoCollectionNewProdutoManutencao = em.merge(oldProdutoOfProdutoManutencaoCollectionNewProdutoManutencao);
                    }
                }
            }
            for (ProdutoCompra produtoCompraCollectionNewProdutoCompra : produtoCompraCollectionNew) {
                if (!produtoCompraCollectionOld.contains(produtoCompraCollectionNewProdutoCompra)) {
                    Produto oldProdutoOfProdutoCompraCollectionNewProdutoCompra = produtoCompraCollectionNewProdutoCompra.getProduto();
                    produtoCompraCollectionNewProdutoCompra.setProduto(produto);
                    produtoCompraCollectionNewProdutoCompra = em.merge(produtoCompraCollectionNewProdutoCompra);
                    if (oldProdutoOfProdutoCompraCollectionNewProdutoCompra != null && !oldProdutoOfProdutoCompraCollectionNewProdutoCompra.equals(produto)) {
                        oldProdutoOfProdutoCompraCollectionNewProdutoCompra.getProdutoCompraCollection().remove(produtoCompraCollectionNewProdutoCompra);
                        oldProdutoOfProdutoCompraCollectionNewProdutoCompra = em.merge(oldProdutoOfProdutoCompraCollectionNewProdutoCompra);
                    }
                }
            }
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = produto.getProdutoId();
                if (findProduto(id) == null) {
                    throw new NonexistentEntityException("The produto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException, RollbackFailureException, Exception {
        EntityManager em = null;
        try {
            utx.begin();
            em = getEntityManager();
            Produto produto;
            try {
                produto = em.getReference(Produto.class, id);
                produto.getProdutoId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The produto with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<ProdutoNumeroSerie> produtoNumeroSerieCollectionOrphanCheck = produto.getProdutoNumeroSerieCollection();
            for (ProdutoNumeroSerie produtoNumeroSerieCollectionOrphanCheckProdutoNumeroSerie : produtoNumeroSerieCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Produto (" + produto + ") cannot be destroyed since the ProdutoNumeroSerie " + produtoNumeroSerieCollectionOrphanCheckProdutoNumeroSerie + " in its produtoNumeroSerieCollection field has a non-nullable produtoId field.");
            }
            List<ProdutoVenda> produtoVendaCollectionOrphanCheck = produto.getProdutoVendaCollection();
            for (ProdutoVenda produtoVendaCollectionOrphanCheckProdutoVenda : produtoVendaCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Produto (" + produto + ") cannot be destroyed since the ProdutoVenda " + produtoVendaCollectionOrphanCheckProdutoVenda + " in its produtoVendaCollection field has a non-nullable produto field.");
            }
            List<ProdutoManutencao> produtoManutencaoCollectionOrphanCheck = produto.getProdutoManutencaoCollection();
            for (ProdutoManutencao produtoManutencaoCollectionOrphanCheckProdutoManutencao : produtoManutencaoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Produto (" + produto + ") cannot be destroyed since the ProdutoManutencao " + produtoManutencaoCollectionOrphanCheckProdutoManutencao + " in its produtoManutencaoCollection field has a non-nullable produto field.");
            }
            List<ProdutoCompra> produtoCompraCollectionOrphanCheck = produto.getProdutoCompraCollection();
            for (ProdutoCompra produtoCompraCollectionOrphanCheckProdutoCompra : produtoCompraCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Produto (" + produto + ") cannot be destroyed since the ProdutoCompra " + produtoCompraCollectionOrphanCheckProdutoCompra + " in its produtoCompraCollection field has a non-nullable produto field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            CategoriaProduto categoriaId = produto.getCategoriaId();
            if (categoriaId != null) {
                categoriaId.getProdutoCollection().remove(produto);
                categoriaId = em.merge(categoriaId);
            }
            List<ReparoProdutoNumeroSerie> reparoProdutoNumeroSerieCollection = produto.getReparoProdutoNumeroSerieCollection();
            for (ReparoProdutoNumeroSerie reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie : reparoProdutoNumeroSerieCollection) {
                reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie.setProdutoId(null);
                reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie = em.merge(reparoProdutoNumeroSerieCollectionReparoProdutoNumeroSerie);
            }
            em.remove(produto);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception re) {
                throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Produto> findProdutoEntities() {
        return findProdutoEntities(true, -1, -1);
    }

    public List<Produto> findProdutoEntities(int maxResults, int firstResult) {
        return findProdutoEntities(false, maxResults, firstResult);
    }

    private List<Produto> findProdutoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Produto as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Produto findProduto(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Produto.class, id);
        } finally {
            em.close();
        }
    }

    public int getProdutoCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Produto as o").getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
